package com.heima.user.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.common.dto.PageResponseResult;
import com.heima.common.dto.ResponseResult;
import com.heima.common.enums.AppHttpCodeEnum;
import com.heima.user.dto.ApAuthor;
import com.heima.user.dto.ApplyDto;
import com.heima.user.dto.RealNameDto;
import com.heima.user.dto.WmUser;
import com.heima.user.entity.ApUser;
import com.heima.user.entity.ApUserRealname;
import com.heima.user.feign.ArticleFeignClient;
import com.heima.user.feign.MediaFeignClient;
import com.heima.user.mapper.ApUserRealnameMapper;
import com.heima.user.service.IApUserRealnameService;
import com.heima.user.service.IApUserService;
import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * <p>
 * APP实名认证信息表 服务实现类
 * </p>
 *
 * @author SpaceTraveller
 * @since 2022-11-07
 */
@Service
public class ApUserRealnameServiceImpl extends ServiceImpl<ApUserRealnameMapper, ApUserRealname> implements IApUserRealnameService {

    @Override
    public PageResponseResult<List<ApUserRealname>> listAppUserRealName(RealNameDto dto) {

        Page<ApUserRealname> apUserRealnamePage = new Page<>(dto.getPage(), dto.getSize());
        LambdaQueryWrapper<ApUserRealname> query = null;
        if (dto.getStatus() != null) {
            query = new LambdaQueryWrapper<ApUserRealname>().eq(ApUserRealname::getStatus, dto.getStatus());
        }
        Page<ApUserRealname> page = this.page(apUserRealnamePage, query);
        return new PageResponseResult<>(dto.getPage(), dto.getSize(), page.getTotal(), page.getRecords());
    }

    @Override
    public ResponseResult authFail(ApplyDto dto) {
        // 通过id找到申请人
        LambdaQueryWrapper<ApUserRealname> query = new LambdaQueryWrapper<ApUserRealname>().eq(ApUserRealname::getUserId, dto.getId());
        ApUserRealname one = this.getOne(query);
        // 申请失败,修改状态,状态  0 创建中  1 待审核  2 审核失败  9 审核通过
        one.setStatus(2);
        // 写原因
        one.setReason(dto.getReason());
        // 更新到数据库
        this.updateById(one);
        ResponseResult responseResult = ResponseResult.okResult("驳回成功");
        responseResult.setErrorMessage("已驳回");
        return responseResult;
    }

    @Autowired
    private MediaFeignClient mediaFeignClient;
    @Autowired
    private ArticleFeignClient articleFeignClient;
    @Autowired
    private IApUserService userService;

    @Override
    @GlobalTransactional
    public ResponseResult authPass(ApplyDto dto) {
        // 审核通过,为用户创建自媒体账号
        LambdaQueryWrapper<ApUserRealname> query = new LambdaQueryWrapper<ApUserRealname>().eq(ApUserRealname::getId, dto.getId());
        ApUserRealname userRealName = this.getOne(query);
        // 通过dto携带的id信息找到用户的信息
        ApUser appUser = userService.getById(userRealName.getUserId());
        WmUser mediaUser = new WmUser();
        BeanUtils.copyProperties(appUser, mediaUser);
        // 设置mediaUser的相关信息
        mediaUser.setId(null);
        mediaUser.setApUserId(appUser.getId());
        mediaUser.setStatus(9); // 状态  0 暂时不可用  1 永久不可用  9 正常可用
        mediaUser.setType(0); // 账号类型  0 个人 1 企业  2 子账号
        mediaUser.setScore(0);
        mediaUser.setCreatedTime(new Date());
        // 远程调用创建自媒体帐号
        ResponseResult<WmUser> mediaUserResult = mediaFeignClient.insertWmUser(mediaUser);
        // 如果返回的信息是成功,在article中创建作者信息
        if (mediaUserResult.getCode() == AppHttpCodeEnum.SUCCESS.getCode()) {
            ApAuthor appAuthor = new ApAuthor();
            appAuthor.setName(mediaUser.getName());
            appAuthor.setUserId(mediaUser.getApUserId());
            appAuthor.setWmUserId(mediaUserResult.getData().getId());
            appAuthor.setType(2);  // 0 爬取数据  1 签约合作商  2 平台自媒体人
            // 调用feign创建
            ResponseResult<ApAuthor> saveAuthorResult = articleFeignClient.saveAuthor(appAuthor);
            // int i = 1 / 0;
            // 如果返回的信息是成功,更新mediaUser
            if (saveAuthorResult.getCode() == AppHttpCodeEnum.SUCCESS.getCode()) {
                mediaUser.setId(mediaUserResult.getData().getId());
                mediaUser.setApAuthorId(saveAuthorResult.getData().getId());
                ResponseResult<WmUser> atLastMediaUser = mediaFeignClient.updateMediaUser(mediaUser);
                // 如果更新mediaUser也成功了,那么更新用户身份
                if (atLastMediaUser.getCode() == AppHttpCodeEnum.SUCCESS.getCode()) {
                    appUser.setFlag(1); // flag 0 普通用户  1 自媒体人  2 大V
                    userService.updateById(appUser);
                } else {
                    throw new RuntimeException("更新自媒体帐号信息异常");
                }
                // 都成功了,那么更新用户申请状态  0 创建中  1 待审核  2 审核失败  9 审核通过
                userRealName.setStatus(9);
                // 更新实名信息
                this.updateById(userRealName);
            } else {
                throw new RuntimeException("创建作者信息异常");
            }
        } else {
            throw new RuntimeException("创建自媒体账号异常");
        }
        return ResponseResult.okResult();
    }
}
